package com.ittao.taoaicodemother.ai.tools;

import cn.hutool.json.JSONObject;
import com.ittao.taoaicodemother.manage.storage.strategy.FileStorageStrategy;
import com.ittao.taoaicodemother.manage.storage.strategy.impl.CosFileStorageStrategy;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolMemoryId;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;


/**
 * 文件修改工具
 * 支持 AI 通过工具调用的方式修改文件内容
 */
@Slf4j
@Component
public class FileModifyTool extends BaseTool {

    @Tool("修改文件内容，用新内容替换指定的旧内容")
    public String modifyFile(
            @P("文件的相对路径")
            String relativeFilePath,
            @P("要替换的旧内容")
            String oldContent,
            @P("替换后的新内容")
            String newContent,
            @ToolMemoryId Long appId
    ) {
        if (relativeFilePath == null || relativeFilePath.trim().isEmpty()) {
            return "错误：文件路径不能为空";
        }

        try {
            // 使用基类的统一路径构建方法
            String fullFilePath = buildFullFilePath(appId, relativeFilePath);

            // 使用策略模式获取当前存储策略
            FileStorageStrategy storageStrategy = getCurrentStorageStrategy();

            // 读取原文件内容
            String originalContent;
            try {
                Resource resource = storageStrategy.readFile(fullFilePath);
                originalContent = new String(resource.getInputStream().readAllBytes(), java.nio.charset.StandardCharsets.UTF_8);
            } catch (Exception e) {
                return "错误：文件不存在或读取失败 - " + relativeFilePath + ", 错误: " + e.getMessage();
            }

            // 检查是否包含要替换的内容
            if (!originalContent.contains(oldContent)) {
                return "警告：文件中未找到要替换的内容，文件未修改 - " + relativeFilePath;
            }

            // 执行内容替换
            String modifiedContent = originalContent.replace(oldContent, newContent);

            // 检查替换后内容是否有变化
            if (originalContent.equals(modifiedContent)) {
                return "信息：替换后文件内容未发生变化 - " + relativeFilePath;
            }

            // 保存修改后的文件（传递appId用于对话历史判断）
            if (storageStrategy instanceof CosFileStorageStrategy) {
                ((CosFileStorageStrategy) storageStrategy).writeFile(fullFilePath, modifiedContent.getBytes(), appId);
            } else {
                storageStrategy.writeFile(fullFilePath, modifiedContent.getBytes());
            }
            log.info("成功修改文件: {}", fullFilePath);
            return "文件修改成功: " + relativeFilePath;

        } catch (Exception e) {
            String errorMessage = "修改文件失败: " + relativeFilePath + ", 错误: " + e.getMessage();
            log.error(errorMessage, e);
            return errorMessage;
        }
    }

    @Override
    public String getToolName() {
        return "modifyFile";
    }

    @Override
    public String getDisplayName() {
        return "修改文件";
    }

    @Override
    public String generateToolExecutedResult(JSONObject arguments) {
        String relativeFilePath = arguments.getStr("relativeFilePath");
        String oldContent = arguments.getStr("oldContent");
        String newContent = arguments.getStr("newContent");

        // 生成与其他工具一致的输出样式
        String result = String.format("""
                        **🔧 [工具调用]** %s %s
                        
                        **替换前：**
                        ```
                        %s
                        ```
                        
                        **替换后：**
                        ```
                        %s
                        ```
                        """, getDisplayName(), relativeFilePath,
                oldContent != null ? oldContent : "(空内容)",
                newContent != null ? newContent : "(空内容)");

        // 输出前端和要持久化的内容
        return String.format("\n\n%s\n\n", result);
    }
}
